package org.apache.dubbo.demo.config;


import org.apache.dubbo.api.demo.DemoService;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.ServiceConfig;
import org.apache.dubbo.config.bootstrap.DubboBootstrap;
import org.apache.dubbo.demo.DemoServiceImpl;
import org.apache.dubbo.api.demo.GlobalConstant;


import java.util.HashMap;
import java.util.Map;

public class TestApplicationConfigApp implements GlobalConstant {

    public static DubboBootstrap bootstrap = DubboBootstrap.getInstance();

    public static void main(String[] args) {

        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("my-provider");

        applicationConfig.setVersion("1.2.7"); // 会注册，但无实际作用。注册到URI中的KEY是application.version。标注的应用的版本信息。唯一注册带有【application.】前缀的KEY。
        applicationConfig.setOwner("king");// 会注册，但无实际作用。如果parameters中有owner，则会覆盖。注册到URI中的KEY是 owner,这个区别与version，是不带用【application.】前缀的。
        applicationConfig.setEnvironment("test"); // 会注册，但无实际作用。如果parameters中有owner，则会覆盖。注册到URI中的KEY是 owner,这个区别与version，是不带用【application.】前缀的。
        applicationConfig.setArchitecture("singleType"); // 会注册，但无实际作用。如果parameters中有architecture，则会覆盖。注册到URI中的KEY是 architecture,这个区别与version，是不带用【application.】前缀的。

        // 不会注册，区别于Owner\Version。一个会注册一个不会注册。即使设置了，也不会注册到URI中。
        applicationConfig.setId("1234567890");

        Map<String, String> parameters = new HashMap<>();
        parameters.put("param1", "value1");
        parameters.put("param2", "value2");
        parameters.put("owner", "value3");// 会替换 applicationConfig.setOwner("king");
        parameters.put("environment", "test-changed");// 会替换 applicationConfig.setEnvironment("test");
        parameters.put("architecture", "singleType-changed");// 会替换 applicationConfig.setArchitecture("singleType");
        parameters.put("id", "1234567891");

        //parameters.put("version", "1.2.8");// 启动时，RegistryProtocol.doRegister()会抛NullPointerException,原因是provider找不到带版本信息的注册信息。

        applicationConfig.setParameters(parameters);// 会替换ApplicationConfig中的所有参数.

        ServiceConfig<DemoServiceImpl> serviceConfig = new ServiceConfig<>();
        serviceConfig.setInterface(DemoService.class);
        serviceConfig.setRef(new DemoServiceImpl());
        //service.setApplication(applicationConfig);


        bootstrap
                .application(applicationConfig)
                .registry(new RegistryConfig(REGISTRY_URL))
                .protocol(new ProtocolConfig(CommonConstants.DUBBO, 20880))
                .service(serviceConfig) // 注释此行没有任何信息会注册到注册中心。但也不会报错。
                .start();

    }

    public void test(String[] args) {
        System.out.println("Hello World!");
    }

}
